package NO2_String;

import java.util.ArrayList;
import java.util.List;

/**
 * 2025-08-21
 * 力扣 - 6. Z 字形变换。
 * <p>
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 * 请你实现这个将字符串进行指定行数变换的函数：
 * string convert(string s, int numRows);
 */
public class ZConvertMain {
    public static void main(String[] args) {

    }

    // 这我都没看懂
//    public static String convert(String s, int numRows) {
//        if (numRows == 1) return s; // 只有一行，直接返回原字符串
//
//        // 创建numRows个StringBuilder，每行一个
//        List<StringBuilder> rows = new ArrayList<>();
//        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
//            rows.add(new StringBuilder());
//        }
//
//        int currentRow = 0;
//        boolean goingDown = false;
//
//        // 遍历字符串，按Z字形路径分配字符到各行
//        for (char c : s.toCharArray()) {
//            rows.get(currentRow).append(c);
//
//            // 当到达顶部或底部时，改变方向
//            if (currentRow == 0 || currentRow == numRows - 1) {
//                goingDown = !goingDown;
//            }
//
//            // 根据方向移动行索引
//            currentRow += goingDown ? 1 : -1;
//        }
//
//        // 将所有行的字符串连接起来
//        StringBuilder result = new StringBuilder();
//        for (StringBuilder row : rows) {
//            result.append(row);
//        }
//
//        return result.toString();
//    }

    // 数学规律法
    public static String convert(String s, int numRows) {
        if (numRows == 1) return s;

        StringBuilder result = new StringBuilder();
        int n = s.length();
        int cycleLen = 2 * numRows - 2; // 一个完整周期的长度

        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j + i < n; j += cycleLen) {
                result.append(s.charAt(j + i)); // 当前周期的竖列字符

                // 如果不是第一行和最后一行，还需要添加斜线上的字符
                if (i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
                    result.append(s.charAt(j + cycleLen - i));
                }
            }
        }

        return result.toString();
    }
}
